package main

import "fmt"

//第一个：& 按位与
//运算规则：如果两数对应的二进制位都为 1，那么结果为 1， 否则结果为 0。
//
//第二个：｜按位或
//运算规则：如果两数对应的二进制位有一个为 1，那么结果为 1， 否则结果为 0。
//
//第三个：^ 按位异或
//运算规则：如果两数对应的二进制位不同，那么结果为 1， 否则结果为 0
/*
题目2：KM,找出现k次的数
题目描述：
一个数组中有一种数出现k次，其他数都出现了M次

M>1, K<M,找到出现了K次的数
要求，额外空间复杂度O(1)，时间复杂度O(N)
*/
/*
1-先创建一个存储位信息的数组（跟int位数等长的32长度的数组）
2，将所有的数组里面的数的位信息累加到上面那个数组
3.遍历存储位信息的数组只要其%m不为0那出现了k次的数在此位上有1
4.之后就遍历完累加就得出出现k次的数
*/
func main() {
	arr := []int{1, 1, 0, 0, 1, 3, 3, 3, 4, 4, 4}
	k := findK(arr, 2, 3)
	fmt.Println("这个数就是", k)
}

func findK(arr []int, k, m int) int {
	res := 0
	placeArr := [32]int{}

	for _, v := range arr {

		for i := 0; i < 32; i++ {
			if ((v >> i) & 1) == 1 {
				placeArr[i] += 1
			}
		}

	}

	for i, v := range placeArr {
		//if v%m!=0 {
		//	res += 1 << i
		//}

		if v%m != 0 && v%m == k {
			res += 1 << i
		} else if v%m == 0 {
			continue
		} else {
			return -1
		}
	}
	if res == 0 {
		count := 0
		for _, v := range arr {
			if v == 0 {
				count++
			}

		}
		if count != k {
			return -1
		}

	}

	return res

}
